package me.learningandroid.ch2_6.fragmentdemo;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;


public class ListFragment extends Fragment {
    private Function<Integer, Void> itemClickedListener;
    private RecyclerView recyclerView;

    public static ListFragment newInstance(List<ContactData> contactDataList) {
        ListFragment fragment = new ListFragment();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("list", new ArrayList<>(contactDataList));
        fragment.setArguments(bundle);
        return fragment;
    }

    public void setOnItemClickedListener(Function<Integer, Void> itemCLickedListener) {
        this.itemClickedListener = itemCLickedListener;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.i(getClass().getName(), "onCreateView");
        // 创建`View`并创建相关的`ViewHolder`，固定写法。
        //            // `LayoutInflater.inflate(id, parent, attachToRoot)`的`attachToRoot`必须为false，即不在创建时与上级的视图节点关联，让`RecyclerView`来关联上级节点。
        View view = inflater.inflate(R.layout.fragment_list, container, false);
        recyclerView = view.findViewById(R.id.recyclerView);
        Bundle bundle = getArguments();
        List<ContactData> data = bundle.getParcelableArrayList("list");
        recyclerView.setAdapter(new MyAdapter(data, (v)-> {
            Integer id = (Integer) v.getTag();
            if (itemClickedListener != null) {
                itemClickedListener.apply(id);
            }
        }));
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        return view;
    }

    public void reload(List<ContactData> data) {
        recyclerView.setAdapter(new MyAdapter(data, (v)-> {
            Integer id = (Integer) v.getTag();
            if (itemClickedListener != null) {
                itemClickedListener.apply(id);
            }
        }));
        // 保存在argument中，在重启时会在
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("list", new ArrayList<>(data));
        setArguments(bundle);
    }

    //  `onSaveInstanceState`在重启前保存临时状态。
    // 这里时是空实现
    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(getClass().getName(), "onSaveInstanceState");
    }

    // `onViewStateRestored`可以用来恢复保存的临时状态。在`onViewCreated`之后，`onCreate`之前调用。
    // 这里时是空实现
    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        Log.i(getClass().getName(), "onViewStateRestored");
    }

    //
    public static class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
        private List<ContactData> data;
        private View.OnClickListener callback;

        public MyAdapter(List<ContactData> data, View.OnClickListener callback) {
            this.data=data;
            this.callback=callback;
        }

        // 当新的元素被添加，则为新的行创建新的`View`和`ViewHolder`。
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            Log.i(getClass().getName(), "onCreateViewHolder");
            // 创建`View`并创建相关的`ViewHolder`，固定写法。
            // `LayoutInflater.inflate(id, parent, attachToRoot)`的`attachToRoot`必须为false，即不在创建时与上级的视图节点关联，让`RecyclerView`来关联上级节点。
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_item,parent,false);
            // 这里的callback是固定的，所以在创建`ViewHolder`时注册即可，不必在`onBindViewHolder`中注册。
            view.setOnClickListener(callback);
            return new MyViewHolder(view);
        }

        // 当滑动列表，一些元素被隐藏，另一些需要展示，此时回收`View`和`ViewHolder`，并绑定到将要显示的数据时，系统调用此方法刷新视图。
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            Log.i(getClass().getName(), "onBindViewHolder");
            ContactData ele = data.get(position);
            holder.textViewName.setText(ele.name);
            holder.textViewPhone.setText(ele.phone);
            // `View`的Tag可以作为额外的数据使用。
            holder.itemView.setTag(position);
        }

        // 返回列表的元素总数
        @Override
        public int getItemCount() {
            Log.i(getClass().getName(), "getItemCount");
            return data.size();
        }

        // `ViewHolder`可以视为是用作缓存View中的组件的组件持有器，避免频繁的使用`itemView.findViewById`。
        public static class MyViewHolder extends RecyclerView.ViewHolder {
            private TextView textViewName;
            private TextView textViewPhone;
            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                Log.i(getClass().getName(), "MyViewHolder");
                textViewName = itemView.findViewById(R.id.textView3);
                textViewPhone = itemView.findViewById(R.id.textView4);
            }
        }
    }
}